import os
import json

#创建一个类，功能是 1、将参数表初始化到内存中 2、匹配参数表以添加标志位 3、返回一个标志位列表flag_list
class Flag_read_and_match:
    def __init__(self,trade_co,duty,country,trade_country,json_directory):  # 接收参数 p，它包含三个属性：trade_co、duty_and_country 和 trade_country_and_product_country
        #初始化连接
        self.trade_co = trade_co
        self.duty = duty
        self.country = country
        self.trade_country, = trade_country
        self.flag_list = []

        # 执行__combine_flag_dicts函数，目的是
        # combine_dict是一个大字典，里面还包含着11个小字典
        self.__combine_flag_dicts(json_directory)
        self.add_all_riskFlags()

    #功能：打开全部11个标志位文件，转换成json文件，封装成到combine_dict字典中，该字典中还包含着11个小字典
    def __combine_flag_dicts(self,json_directory):
        # PATH = os.getcwd()
        # json_directory = os.path.join(PATH, 'rishflagdata')
        # json_directory = "path/to/json/files"
        combine_dict = {}
        for file_name in os.listdir(json_directory):
            if file_name.endswith('.json'):
                file_path = os.path.join(json_directory, file_name)

                with open(file_path,'r',encoding='utf-8') as json_file:
                    data = json.load(json_file)
                    key = os.path.splitext(file_name)[0]
                    combine_dict[key] = data
        self.combine_dict = combine_dict


    def add_all_riskFlags(self):
        # flag_list = []
        #2024年高风险黑名单标志位的匹配，匹配字典中的combine_dict["2024_high_risk_flag"][self.trade_co]
        self.__process_method_fin("2024_high_risk_flag", self.trade_co, self.flag_list,"06")
        #2023年高风险黑名单标志位的匹配，取字典中的combine_dict["2023_high_risk_flag"][self.trade_co]
        self.__process_method_fin("2023_high_risk_flag", self.trade_co, self.flag_list,"07")
        #2022年及之前高风险黑名单标志位的匹配，取字典中的combine_dict["2022_high_risk_flag"][self.trade_co]
        self.__process_method_fin("2022_high_risk_flag", self.trade_co, self.flag_list,"08")
        #二次查验标志位标志位的匹配，取字典中的combine_dict["2_inspection_risk_flag"][self.trade_co]
        self.__process_method_fin("2_inspection_risk_flag", self.trade_co, self.flag_list,"09")
        #二次查获标志位的匹配，取字典中的combine_dict["2_seized_risk_flag"][self.trade_co]
        self.__process_method_fin("2_seized_risk_flag", self.trade_co, self.flag_list, "10")
        #标志三异”报关单，即企业注册地、申报地、进出口岸均不同的报关单标志位的匹配，取字典中的combine_dict["Non_manufacturing_enterprises_have_large_export_weight_flag"][self.trade_co]
        self.__process_method_fin("Three_Differences_in_Indicators_flag",self.trade_co, self.flag_list, "11")
        #非生产型企业出口重量大标志位的匹配，取字典中的combine_dict["Risks_of_New_Routes_for_New_Airlines_flag"][self.trade_co]
        self.__process_method_fin("Non_manufacturing_enterprises_have_large_export_weight_flag",
                                  self.trade_co, self.flag_list, "12")
        #新航空公司新航线的风险标志位的匹配，取字典中的combine_dict["Goods_Declared_by_Enterprises_for_Customs_Clearance_flag"][self.trade_co],需要取反
        self.__process_method_not_fin("Risks_of_New_Routes_for_New_Airlines_flag",
                                  self.trade_co, self.flag_list, "13")
        #冲关申报企业商品标志位的匹配，取字典中的combine_dict["Any_Anomalies_in_Goods_with_Origin_Shift_flag"][self.duty_and_country]
        self.__process_method_fin("Goods_Declared_by_Enterprises_for_Customs_Clearance_flag",
                                  self.trade_co, self.flag_list, "14")
        #原产地漂移商品是否存在异常标志位的匹配，取字典中的combine_dict["Added_to_Air_Transport_Channels_for_Automatic_Monitoring_flag"][self.trade_country_and_product_country]
        self.__process_method_fin("Any_Anomalies_in_Goods_with_Origin_Shift_flag",
                                  self.duty + self.country, self.flag_list, "15")
        #空运渠道新增商品种类、新增国家设置自动布控标志位的匹配，取字典中的combine_dict["Any_Anomalies_in_Goods_with_Origin_Shift_flag"][self.duty_and_country]，需要取反
        self.__process_method_not_fin("Added_to_Air_Transport_Channels_for_Automatic_Monitoring_flag",
                                  self.trade_country, self.flag_list, "16")
        flag_list = [flag for flag in self.flag_list if flag != '00']
        return flag_list

    # 功能：匹配一个字段的标志位，若在参数表中查询到了，则在flag_list中添加标志位flag
    # key为表名，值为os.path.splitext(file_name)[0]
    # find为需要查找的标志位
    # flag_list为添加的标志位列表
    # flag为"06,07,08..."
    # combined_dict为所有的标志位表
    def __process_method_fin(self,key,find,flag_list,flag):
        try:
            if find in self.combine_dict[key]:
                flag_list = flag_list.append(flag)
        except Exception as e:
            print(" process_method_fin_error! ",e)

    # 功能：在匹配时，有两个标志位的数据是需要取反的，因此需要这个函数
    # key为表名，值为os.path.splitext(file_name)[0]
    # find1、find2为需要查找的两个标志位
    # flag_list为添加的标志位列表
    # flag为"06,07,08..."
    # combined_dict为所有的标志位表
    def __process_method_not_fin(self, key, find, flag_list, flag):
        try:
            if find not in self.combine_dict[key]:
                flag_list = flag_list.append(flag)
        except Exception as e:
            print(" process_method_not_fin_error! ",e)
